package Lock;
public class Ticket {
  //获取当前jvm能使用到的cpu数量
  //int num= Runtime.getRuntime().availableProcessors();
  //System.out.println(num);

/**锁-->线程同步
 * 是为了防止多个线程访问一个数据对象时，对数据造成的破坏线程同步
 * 其实就是排队，然后一个一个对共享资源进行操作
 * 而不是同时进行操作I只有共享资源的读写访问才需要同步
 */
    private static int ticket=100;

    public static void main(String[] args) {
     Ticket ticket=new Ticket();

     Runnable R1=()->{
         while (true){
             int i=ticket.function();
             if(i<=0){break;}
         }
     } ;
     new Thread(R1,"A").start();
     new Thread(R1,"B").start();


    }


    /**
     * 同步方法 - 锁
     */
    public synchronized int function(){
        if (ticket>0) {
           //上锁 synchronized
            //当前得到CPU使用权的线程为lock上锁，此时别的线程得到CPU使用权，发现对象已上锁，其他对象就必须等待lock释放
            ticket--;
            String name = Thread.currentThread().getName();
            System.out.println(name + "销售了一张车票！余票：" + ticket);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        return ticket;
    }
}
